docker: 使用指定的 nuget server 部署应用程序.
我们在项目中经常会需要搭建并使用自己的 nuget server, 用来存放一些私有的程序集。
虽然使用私有 nuget server 在 visual studio 中跟 nuget.org 并没有什么区别,但是,如果使用 dotnet restore
来对项目进行包还原,则需要进行一些特殊配置,否则就会出现类似 “无法从 nuget.org 中找到指定 package” 的问题。
一个比较常见到的场景,就是在将应用程序部署到 docker 的时候,由于我们会在 Dockerfile
中 通过 RUN dotnet restore xxx
命令来进行包还原,所以经常会遇到下面的错误:
Step 9/18 : RUN dotnet restore "Demo.WebApi/Demo.WebApi.csproj"
---> Running in 368692ab51d2
Determining projects to restore...
/src/Demo.WebApi/Demo.WebApi.cdproj : error NU1101: Unable to find package xxxxxx. No packages exist with this id in source(s): nuget.org [/src/Demo.WebApi/Demo.WebApi.csproj]
参照上述错误信息,我们很容易发现:dotnet restore
命令试图从 nuget.org 下载我们项目中所以来的私有包,拿找不到的话就很正常了。
所以到底怎么办呢?
1. 在项目中添加 nuget.config 文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
<!-- PrivateNuGet: your private nuget server -->
<add key="PrivateNuGet" value="https://nuget.demo.com/v3/index.json" />
</packageSources>
</configuration>
2. 修改 Dockerfile
找到 RUN dotnet restore
命令,在其执行之前,将 nuget.config
复制到指定位置,并为 dotnet restore
命令添加参数 configfile
, 用于指定 nuget package source。
COPY ["Demo.Api/nuget.config", "Demo.Api/"]
RUN dotnet restore "Demo.Api/Demo.Api.csproj" --configfile "Demo.Api/nuget.config"